package io.yunho.yunho.interview.two.encryp;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.digest.BCrypt;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;

/**
 * @author: yunho
 * @date: 2021/8/20 11:01
 * @description:
 */
public class EncrypTest {
    public static void main(String[] args) {
        String word= "hello world";
//        //MD5
//        System.out.println(SecureUtil.md5(word));
//
//        //sha256
//        String sha256Hex = DigestUtil.sha256Hex(word);
//        System.out.println(sha256Hex);
//        //SM3
//        String digestHex = SmUtil.sm3(word);
//        System.out.println(digestHex);
//
//        //AES
//
//        //随机生成密钥
//        byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//        System.out.println("随机生成密钥******\t"+key);
//        //构建
//        SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
//        //加密
//        byte[] encrypt = aes.encrypt(word);
//        System.out.println("加密后********\t"+encrypt);
//        //解密
//        byte[] decrypt = aes.decrypt(encrypt);
//        System.out.println("解密后********\t"+decrypt);
//        //加密为16进制表示
//        String encryptHex = aes.encryptHex(word);
//        System.out.println("加密为16进制表示********\t"+encryptHex);
//        //解密为字符串
//        String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
//        System.out.println("解密16进制********\t"+decryptStr);
//
//        //SM4
//        SymmetricCrypto sm4 = SmUtil.sm4();
//
//        String s = sm4.encryptHex(word);
//        System.out.println("SM4加密后*******\t"+s);
//        String dS = sm4.decryptStr(s, CharsetUtil.CHARSET_UTF_8);
//        System.out.println("SM4解密后*******\t"+dS);
//
//        //RSA
//        RSA rsa = new RSA();
//
//        //获得私钥
//        System.out.println("获得私钥******\t"+rsa.getPrivateKey());
//        System.out.println("获得私钥64******\t"+rsa.getPrivateKeyBase64());
//        //获得公钥
//        System.out.println("获得公钥******\t"+rsa.getPublicKey());
//        System.out.println("获得公钥64******\t"+rsa.getPublicKeyBase64());
//
//        //公钥加密，私钥解密
//        byte[] encryptRSA = rsa.encrypt(StrUtil.bytes(word, CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
//        System.out.println("公钥加密******\t"+encryptRSA);
//        byte[] decryptRSA = rsa.decrypt(encryptRSA, KeyType.PrivateKey);
//        System.out.println("私钥解密******\t"+decryptRSA);
//        System.out.println("私钥解密明文******\t"+StrUtil.str(decryptRSA,CharsetUtil.CHARSET_UTF_8));
//
////        //公钥加密，私钥解密
////        byte[] encryptRSAStr =  rsa.encrypt(StrUtil.bytes(word, CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
////        System.out.println("公钥字符加密******\t"+encryptRSAStr);
////        String decryptRSAStr = rsa.decryptStr(StrUtil.str(encryptRSAStr,CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey);
////        System.out.println("私钥字符解密******\t"+decryptRSAStr);
//
//
//        //Junit单元测试
////        Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8));
//
//        //私钥加密，公钥解密
//        byte[] encryptRSA2 = rsa.encrypt(StrUtil.bytes(word, CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey);
//        System.out.println("私钥加密******\t"+encryptRSA2);
//        byte[] decryptRSA2 = rsa.decrypt(encryptRSA2, KeyType.PublicKey);
//        System.out.println("公钥解密******\t"+decryptRSA2);


        //Junit单元测试
        //Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt2, CharsetUtil.CHARSET_UTF_8));

        //BCrypt
        String salt = BCrypt.gensalt();
        System.out.println("salt***************"+salt);
        String pw_hash = BCrypt.hashpw(word, salt);
        System.out.println("pw_hash********\t"+pw_hash);
        String encodedPassword = "$2a$10$y6jqMbgAOyspX/N6YCIJOOUyBwAar6GwMF8QODHmcuAQbAOJ/TUkC";
        //验证是否一致
        System.out.println(BCrypt.checkpw(word, encodedPassword));
        //gensalt方法提供了可选参数 (log_rounds) 来定义加盐多少，也决定了加密的复杂度:默认是10，复杂度越高越安全，但是效率越低
        String strong_salt = BCrypt.gensalt(10);
        String stronger_salt = BCrypt.gensalt(12);
        String strong_hash = BCrypt.hashpw(word, strong_salt);
        String stronger_hash = BCrypt.hashpw(word, stronger_salt);
        //$2a$10$wE368HEs30T6NocLz.QIT.7vDA2kYK/jY10GvWb2wJb4yYr/l4N4W
        System.out.println("默认10复杂度的加密***********\t"+strong_hash);
        //$2a$12$81A8jaJA/dQNaXCLAXyh5uFsiym2TSeRFrHAlWdYEqgv.qTuSP12m
        System.out.println("自定义12复杂度的加密***********\t hhh"+stronger_hash);


    }
}
